package com.question.business.user.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.question.business.user.entity.User;
import com.question.business.user.model.ao.*;
import com.question.business.user.model.dto.UserCacheDTO;
import com.question.business.user.model.vo.UserAddVO;
import com.question.business.user.model.vo.UserDetailVO;
import com.question.business.user.model.vo.UserDropDownVO;
import com.question.business.user.model.vo.UserVO;

import javax.servlet.ServletOutputStream;
import java.util.List;
import java.util.Map;

/**
 * 用户服务
 *
 * @author star
 * @since 2022-07-20
 */
public interface IUserService extends IService<User> {

    /**
     * 用户分页查询
     *
     * @param ao 请求参数
     * @return Page<UserVO> 响应参数
     */
    Page<UserVO> queryUserPage(UserPageAO ao);

    /**
     * 用户明细查询
     *
     * @param id 用户ID
     * @return UserDetailVO 响应参数
     */
    UserDetailVO queryUserDetail(String id);

    /**
     * 用户新增数据
     *
     * @param ao 请求参数
     * @return UserAddVO 响应参数
     */
    UserAddVO addUser(UserAddAO ao);

    /**
     * 用户修改数据
     *
     * @param ao 数据
     */
    void updateUser(UserUpdateAO ao);

    /**
     * 用户删除数据
     *
     * @param id 用户ID
     */
    void deleteUser(String id);

    /**
     * 用户批量删除数据
     *
     * @param ids 用户ID
     */
    void deleteBatchUser(List<String> ids);

    /**
     * 用户导出数据
     *
     * @param ao     请求参数
     * @param stream 输出流
     */
    void exportUser(UserPageAO ao, ServletOutputStream stream);

    /**
     * 根据用户名称查询用户信息
     *
     * @param username 用户名称
     * @return User
     */
    User queryUserByUsername(String username);

    /**
     * 查询用户缓存
     *
     * @return Map<String, UserCacheDTO>
     */
    Map<String, UserCacheDTO> queryUserCache();

    /**
     * 用户类型启用、停用
     *
     * @param ao 数据
     */
    void enableUser(UserEnabledAO ao);

    /**
     * 根据用户名称更新错误次数
     *
     * @param username 用户名称
     */
    void changeLoginErrorNumber(String username);

    /**
     * 根据用户id解锁
     *
     * @param id 用户ID
     */
    void unlockUser(String id);

    /**
     * 用户下拉列表查询
     *
     * @param ao 请求参数
     * @return List<UserDropDownVO> 响应参数
     */
    List<UserDropDownVO> queryUserDropDown(UserDropDownAO ao);

    /**
     * 用户重置密码
     *
     * @param ao 请求参数
     */
    void resetUserPassword(UserResetPasswordAO ao);
}